home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Graphics_Utils / aMiPEG_1.1 / src / svideo.s < prev    next >
Text File  |  1998-06-24  |  21KB  |  1,054 lines

  1. ;
  2. ; Some practical assembler utility routines. See sutils.h for corresponding C prototypes.
  3. ; These are mostly called from within video.c as most of them are kinda copy
  4. ; routines which handle cropping and adding together different-sized channels.
  5. ;
  6. ; Michael Rausch  14-4-94  1:14:30
  7. ;
  8.  
  9.     SECTION    text,CODE
  10.  
  11. ER    EQU    -1
  12.  
  13. OK    EQU    1
  14. UNDERFLOW EQU    -2
  15.  
  16.     XREF    @correct_underflow
  17.     XREF    _bitBuffer
  18.     XREF    _bufLength
  19.     XREF    _bitBuffer
  20.     XREF    _bitOffset
  21. ;    XREF    _bitCount    ; ANALYSIS
  22. ;    XREF    _mbCoeffPtr    ; ANALYSIS
  23.  
  24.     XREF    _dct_coeff_first
  25.     XREF    _dct_coeff_next
  26.     XREF    _dct_coeff_tbl_0
  27.     XREF    _dct_coeff_tbl_1
  28.     XREF    _dct_coeff_tbl_2
  29.     XREF    _dct_coeff_tbl_3
  30.  
  31.  
  32.     XREF    _clamp
  33.  
  34.  
  35. ; ***************************************************************
  36.  
  37.  
  38.     XDEF    @next_start_code
  39. @next_start_code:
  40.     moveq    #120,d1            ; was 2
  41.     cmp.l    _bufLength(a4),d1
  42.     ble.s    nsc_nc
  43.     bsr    @correct_underflow
  44. nsc_nc:
  45.     move.l    d2,a1
  46.  
  47.     move.l    _bitOffset(a4),d1
  48.     move.l    _bitBuffer(a4),a0
  49.     move.l    _bufLength(a4),d2
  50.  
  51.     moveq    #7,d0
  52.     and.l    d1,d0
  53.     beq.s    nsc_is_byte_border
  54.     addq.l    #8,d1
  55.     sub.l    d0,d1
  56.     moveq    #32,d0
  57.     cmp.l    d0,d1
  58.     blt.s    nsc_is_byte_border
  59.     sub.l    d0,d1
  60.     addq.l    #4,a0
  61.     subq.l    #1,d2
  62. nsc_is_byte_border:
  63.  
  64.     lsr.l    #3,d1
  65.     add.l    d1,a0            ; a0 is on a longword bound, so align a0 to the byte boundary
  66.  
  67.     lsl.l    #2,d2
  68.     add.l    a0,d2            ; end of the buffer
  69.  
  70.     move.w    (a0)+,d0        ; prefetch 16 bits
  71.  
  72.     moveq    #1,d1
  73. nsc_loop:
  74.     cmp.l    d2,a0
  75.     bge.s    nsc_underflow
  76.     ext.l    d0            ; this one is critical!
  77.     lsl.l    #8,d0
  78.     move.b    (a0)+,d0
  79. ;    tst.l    d0
  80. ;    beq.s    nsc_found
  81.     cmp.l    d1,d0
  82.     bne.s    nsc_loop
  83. nsc_found:
  84.  
  85.     subq.l    #3,a0            ; last 24 bits are the new startcode
  86.     move.l    a0,d1
  87.     and.l    #3,d1
  88.     sub.l    d1,a0            ; new bitBuffer
  89.     lsl.l    #3,d1            ; new bitOffset
  90.     sub.l    a0,d2            ; new bufLength
  91.     lsr.l    #2,d2
  92.  
  93.     move.l    a0,_bitBuffer(a4)
  94.     move.l    d1,_bitOffset(a4)
  95.     move.l    d2,_bufLength(a4)
  96.     move.l    a1,d2
  97.     moveq    #OK,d0
  98.     rts
  99. nsc_underflow:
  100.     move.l    a0,_bitBuffer(a4)    ; i.e. exact end of buffer
  101.     clr.l    _bitOffset(a4)        ; no data available anymore
  102.     clr.l    _bufLength(a4)
  103.     move.l    a1,d2
  104.     moveq    #UNDERFLOW,d0
  105.     rts
  106.  
  107. ; ***************************************************************
  108.  
  109.  
  110.     XDEF    @s_DecodeCBP
  111. @s_DecodeCBP:
  112.     moveq    #9,d0
  113.     lea    _coded_block_pattern,a0
  114.     bra.s    @s_get_byte_huff
  115.  
  116.     XDEF    @sn_DecodeCBP
  117. @sn_DecodeCBP:
  118.     moveq    #9,d0
  119.     lea    _coded_block_pattern,a0
  120.     bra.s    @sn_get_byte_huff
  121.  
  122.  
  123. gsh_x:    move.l    d2,-(sp)
  124.     move.l    a0,-(sp)
  125.     move.l    d0,d2
  126.     bsr    @correct_underflow
  127.     move.l    d2,d0
  128.     move.l    (sp)+,a0
  129.     bra.s    sngsh
  130.  
  131.     XDEF    @s_get_byte_huff
  132. @s_get_byte_huff:
  133.     moveq    #2,d1
  134.     cmp.l    _bufLength(a4),d1
  135.     bgt.s    gsh_x
  136.  
  137.     XDEF    @sn_get_byte_huff
  138. @sn_get_byte_huff:
  139.     move.l    d2,-(sp)
  140. sngsh:
  141.  
  142.     move.l    _bitOffset(a4),d1
  143.     move.l    _bitBuffer(a4),a1
  144.     bfextu    (a1){d1:d0},d2
  145.  
  146.     move.w    (a0,d2.w*2),d0
  147.  
  148.     moveq    #0,d2
  149.     move.b    d0,d2
  150.  
  151. ;    add.l    d2,_bitCount(a4)    ; ANALYSIS
  152.  
  153.     add.l    d1,d2
  154.     moveq    #32,d1
  155.     cmp.l    d1,d2
  156.     blt.s    sgdhw
  157.     sub.l    d1,d2
  158.     addq.l    #4,_bitBuffer(a4)
  159.     subq.l    #1,_bufLength(a4)
  160. sgdhw:
  161.     move.l    d2,_bitOffset(a4)
  162.  
  163.     lsr.w    #8,d0
  164.     extb.l    d0
  165.  
  166.     move.l    (sp)+,d2
  167.     rts
  168.  
  169. ; ***************************************************************
  170.  
  171.     XDEF    @s_DecodeDCTDCSizeLum
  172. @s_DecodeDCTDCSizeLum:
  173.     moveq    #7,d1
  174.     lea    _dct_dc_size_luminance,a1
  175.     bra.s    sdlc
  176.  
  177.     XDEF    @s_DecodeDCTDCSizeChrom
  178. @s_DecodeDCTDCSizeChrom:
  179.     moveq    #8,d1
  180.     lea    _dct_dc_size_chrominance,a1
  181. sdlc:    move.l    d2,-(sp)
  182.     move.l    d3,-(sp)
  183.  
  184.     move.l    _bitOffset(a4),d0
  185.     move.l    _bitBuffer(a4),a0
  186.     moveq    #16,d3
  187.     bfextu    (a0){d0:d3},d2
  188.  
  189.     move.l    d2,d0
  190.     sub.l    d1,d3
  191.     lsr.l    d3,d0
  192.     move.w    (a1,d0.w*2),d0        ; macroval
  193.  
  194.     move.b    d0,d3            ; flushed.l
  195.     lsl.w    d3,d2
  196.     lsr.w    d3,d2            ; mask off the header
  197.  
  198.     lsr.w    #8,d0            ; size
  199.     tst.w    d0            ; necessary ?
  200.     beq.s    cdlflush
  201.  
  202.     add.w    d0,d3
  203.     moveq    #16,d1
  204.     sub.l    d3,d1
  205.     lsr.l    d1,d2            ; trash unused lower bits
  206.  
  207.     subq.l    #1,d0            ; MPEG has some really strange sign extension, just like JPEG! Weirdo!
  208.     btst    d0,d2
  209.     bne    cdlsign
  210.     moveq    #-2,d1
  211.     lsl.l    d0,d1
  212.     or.l    d1,d2
  213.     addq.l    #1,d2
  214. cdlsign: move.l    d2,d0            ; the desired result
  215. cdlflush:
  216.  
  217. ;    add.l    d3,_bitCount(a4)    ; ANALYSIS
  218.  
  219.     add.l    _bitOffset(a4),d3
  220.     moveq    #32,d1
  221.     cmp.l    d1,d3
  222.     blt.s    cdlXw
  223.     sub.l    d1,d3
  224.     addq.l    #4,_bitBuffer(a4)
  225.     subq.l    #1,_bufLength(a4)
  226. cdlXw:
  227.     move.l    d3,_bitOffset(a4)
  228.     move.l    (sp)+,d3
  229.     move.l    (sp)+,d2
  230.     rts
  231.  
  232.  
  233. ; ***************************************************************
  234.  
  235. sgb1:    bsr    @correct_underflow
  236.     bra.s    @sn_get_bits1
  237.  
  238.     XDEF    @s_get_bits1
  239. @s_get_bits1:
  240.     moveq    #2,d1
  241.     cmp.l    _bufLength(a4),d1
  242.     bgt.s    sgb1
  243.  
  244.     XDEF    @sn_get_bits1
  245. @sn_get_bits1:
  246. ;    addq.l    #1,_bitCount(a4)    ; ANALYSIS
  247.     move.l    _bitBuffer(a4),a0
  248.     move.l    _bitOffset(a4),d1
  249.     moveq    #1,d0            ; hmm ?!
  250.     bfextu    (a0){d1:d0},d0
  251.     addq.l    #1,d1
  252.     btst    #5,d1
  253.     beq.s    gb1r
  254.     addq.l    #4,a0
  255.     moveq    #0,d1
  256.     move.l    a0,_bitBuffer(a4)
  257.     subq.l    #1,_bufLength(a4)
  258. gb1r:    move.l    d1,_bitOffset(A4)
  259.     rts
  260.  
  261.  
  262.  
  263. sgbX:    move.l    d0,-(sp)
  264.     bsr    @correct_underflow
  265.     move.l    (sp)+,d0
  266.     bra.s    @sn_get_bitsX
  267.  
  268.     XDEF    @s_get_bitsX
  269. @s_get_bitsX:
  270.     moveq    #2,d1
  271.     cmp.l    _bufLength(a4),d1
  272.     bgt.s    sgbX
  273.  
  274.     XDEF    @sn_get_bitsX
  275. @sn_get_bitsX:
  276. ;    add.l    d0,_bitCount(a4)    ; ANALYSIS
  277.     move.l    _bitOffset(a4),d1
  278.     move.l    _bitBuffer(a4),a0
  279.     move.l    d1,a1
  280.     add.l    d0,a1
  281.     bfextu    (a0){d1:d0},d0
  282.     moveq    #32,d1
  283.     cmp.l    d1,a1
  284.     blt.s    gsbXw
  285.     sub.l    d1,a1
  286.     addq.l    #4,a0
  287.     move.l    a0,_bitBuffer(a4)
  288.     subq.l    #1,_bufLength(a4)
  289. gsbXw:    move.l    a1,_bitOffset(a4)
  290.     rts
  291.  
  292.  
  293. ; ***************************************************************
  294.  
  295. ssb32_ofoi:
  296.     bsr    @correct_underflow        ; ofoi OPT
  297.     bra.s    @sn_show_bits32
  298.  
  299.     XDEF    @s_show_bits32
  300. @s_show_bits32
  301.     moveq    #2,d1
  302.     cmp.l    _bufLength(a4),d1
  303.     bgt.s    ssb32_ofoi
  304.  
  305.     XDEF    @sn_show_bits32
  306. @sn_show_bits32:
  307.     move.l    _bitBuffer(a4),a0
  308.     move.l    _bitOffset(a4),d1
  309.     moveq    #32,d0
  310.     bfextu    (a0){d1:d0},d0
  311.     rts
  312.  
  313.  
  314. ssb_x:    move.l    d0,-(sp)
  315.     bsr    @correct_underflow
  316.     move.l    (sp)+,d0
  317.     bra.s    @sn_show_bitsX
  318.  
  319.     XDEF    @s_show_bitsX
  320. @s_show_bitsX
  321.     moveq    #2,d1
  322.     cmp.l    _bufLength(a4),d1
  323.     bgt.s    ssb_x
  324.  
  325.     XDEF    @sn_show_bitsX
  326. @sn_show_bitsX:
  327.     move.l    _bitOffset(a4),d1
  328.     move.l    _bitBuffer(a4),a0
  329.     bfextu    (a0){d1:d0},d0
  330.     rts
  331.  
  332.  
  333.  
  334. ; ***************************************************************
  335.  
  336.  
  337. sf32_ofoi:
  338.     bsr    @correct_underflow    ; moved away
  339.     bra.s    @sn_flush_bits32
  340.  
  341.     XDEF @s_flush_bits32
  342. @s_flush_bits32:
  343.     moveq    #2,d1
  344.     cmp.l    _bufLength(a4),d1
  345.     bgt.s    sf32_ofoi
  346.  
  347.     XDEF @sn_flush_bits32
  348. @sn_flush_bits32:
  349. ;    add.l    #32,_bitCount(a4)    ; ANALYSIS
  350.     addq.l    #4,_bitBuffer(a4)
  351.     subq.l    #1,_bufLength(a4)
  352.     rts
  353.  
  354.  
  355. sf_outtafoi:
  356.     move.l    d0,-(sp)
  357.     bsr    @correct_underflow    ; moved away, out of flow of instructions
  358.     move.l    (sp)+,d0
  359.     bra.s    @sn_flush_bits
  360.  
  361.     XDEF @s_flush_bits
  362. @s_flush_bits:
  363.     moveq    #2,d1
  364.     cmp.l    _bufLength(a4),d1
  365.     bgt.s    sf_outtafoi
  366.  
  367.     XDEF @sn_flush_bits
  368. @sn_flush_bits:
  369. ;    add.l    d0,_bitCount(a4)    ; ANALYSIS
  370.     add.l    _bitOffset(a4),d0
  371.     moveq    #32,d1
  372.     cmp.l    d1,d0
  373.     blt.s    sbf32
  374.     sub.l    d1,d0
  375.     addq.l    #4,_bitBuffer(a4)
  376.     subq.l    #1,_bufLength(a4)
  377. sbf32:    move.l     d0,_bitOffset(a4)
  378.     rts
  379.  
  380. locallevel:    ds.l    1
  381.  
  382. ; ***************************************************************
  383.  
  384. bgsh_x:    move.l    a0,-(sp)
  385.     move.l    d0,-(sp)
  386.     move.l    a1,-(sp)
  387.     bsr    @correct_underflow
  388.     move.l    (sp)+,a1
  389.     move.l    (sp)+,d0
  390.     bra.s    bsngsh
  391.  
  392.     XDEF    @s_get_bits_huff
  393. @s_get_bits_huff:
  394.     moveq    #2,d1
  395.     cmp.l    _bufLength(a4),d1
  396.     bgt.s    bgsh_x
  397.  
  398.     XDEF    @sn_get_bits_huff
  399. @sn_get_bits_huff:
  400.     move.l    a0,-(sp)
  401. bsngsh:
  402.  
  403.     move.l    _bitOffset(a4),d1
  404.     move.l    _bitBuffer(a4),a0
  405.     bfextu    (a0){d1:d0},d2
  406.  
  407.     move.l    (sp)+,a0
  408.  
  409.     move.w    (a1,d2.w*2),d0
  410.     bmi.s    gbh_error
  411.  
  412.     moveq    #0,d2
  413.     move.b    d0,d2
  414.  
  415. ;    add.l    d2,_bitCount(a4)    ; ANALYSIS
  416.  
  417.     add.l    d1,d2
  418.     moveq    #32,d1
  419.     cmp.l    d1,d2
  420.     blt.s    bsgdhw
  421.     sub.l    d1,d2
  422.     addq.l    #4,_bitBuffer(a4)
  423.     subq.l    #1,_bufLength(a4)
  424. bsgdhw:
  425.     move.l    d2,_bitOffset(a4)
  426.  
  427.     lsr.w    #8,d0
  428.     moveq    #0,d1
  429.     lsr.w    #1,d0
  430.     addx.w    d1,d1
  431.     move.l    d1,(a0)            ; save intra
  432.     rts
  433.  
  434. gbh_error:
  435.     moveq    #1,d0
  436.     move.l    d0,(a0)
  437.     rts
  438.  
  439.  
  440.  
  441. ; ***************************************************************
  442.  
  443. ;void PMB2_reconstruct(char *dest, char *dest1, char *source, char *source1, int row_incr);
  444.  
  445.     XDEF    _PMB2_reconstruct
  446. _PMB2_reconstruct:
  447.     subq.l    #2,d0            ; (int*)   correct row_size
  448.     lsl.l    #2,d0
  449.     moveq    #7,d1
  450. pmb2_all_rows:
  451.     move.l    (a2)+,(a0)+
  452.     move.l    (a2)+,(a0)+
  453.     move.l    (a3)+,(a1)+
  454.     move.l    (a3)+,(a1)+
  455.     add.l    d0,a0
  456.     add.l    d0,a1
  457.     add.l    d0,a2
  458.     add.l    d0,a3
  459.     dbra    d1,pmb2_all_rows
  460.     rts
  461.  
  462. ; ***************************************************************
  463.  
  464. ;void PMB1_reconstruct(char *dest, char *source, int row_incr);
  465.  
  466.     XDEF    _PMB1_reconstruct
  467. _PMB1_reconstruct:
  468.     subq.l    #4,d0            ; correct row_size
  469.     lsl.l    #2,d0
  470.     moveq    #15,d1
  471. pmb1_all_rows:
  472.     move.l    (a1)+,(a0)+
  473.     move.l    (a1)+,(a0)+
  474.     move.l    (a1)+,(a0)+
  475.     move.l    (a1)+,(a0)+
  476.     add.l    d0,a0
  477.     add.l    d0,a1
  478.     dbra    d1,pmb1_all_rows
  479.     rts
  480.  
  481. ; ***************************************************************
  482.  
  483. ; void PSB4_reconstruct(char *dest, char *dest1, char *source1, char *source2, char *source1a, char *source2a, int row_size);
  484. ;
  485.  
  486.     XDEF    _PSB4_reconstruct
  487. _PSB4_reconstruct:
  488. psb4reg REG    d2-d4
  489.     movem.l    psb4reg,-(sp)
  490.  
  491.     subq.l    #8,d0            ; correct row_size
  492.  
  493.     move.l    #$fefefefe,d3
  494.  
  495.     moveq    #7,d4
  496. psb4_all_rows:
  497.  
  498.     REPT    2
  499.     move.l    (a2)+,d1
  500.     move.l    (a3)+,d2
  501.     and.l    d3,d1
  502.     and.l    d3,d2
  503.     add.l    d1,d2
  504.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  505.     move.l    d2,(a0)+        ; this one kicks ass !!!
  506.     ENDR
  507.  
  508.     REPT    2
  509.     move.l    (a5)+,d1
  510.     move.l    (a6)+,d2
  511.     and.l    d3,d1
  512.     and.l    d3,d2
  513.     add.l    d1,d2
  514.     roxr.l    #1,d2
  515.     move.l    d2,(a1)+
  516.     ENDR
  517.  
  518.     add.l    d0,a0
  519.     add.l    d0,a1
  520.     dbra    d4,psb4_all_rows
  521.  
  522.     movem.l    (sp)+,psb4reg
  523.     rts
  524.  
  525.  
  526. ; ***************************************************************
  527.  
  528. ; void PSB3_reconstruct(char *dest, char *source1, char *source2, int row_size);
  529. ;
  530.  
  531.     XDEF    _PSB3_reconstruct
  532. _PSB3_reconstruct:
  533. psb3reg REG    d2-d4
  534.     movem.l    psb3reg,-(sp)
  535.  
  536.     sub.l    #16,d0            ; correct row_size
  537.  
  538.     move.l    #$fefefefe,d3
  539.  
  540.     moveq    #15,d4
  541. psb3_all_rows:
  542.  
  543.     REPT    4
  544.     move.l    (a1)+,d1
  545.     move.l    (a2)+,d2
  546.     and.l    d3,d1
  547.     and.l    d3,d2
  548.     add.l    d1,d2
  549.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  550.     move.l    d2,(a0)+        ; this one kicks ass !!!
  551.     ENDR
  552.  
  553.     add.l    d0,a0
  554.     dbra    d4,psb3_all_rows
  555.  
  556.     movem.l    (sp)+,psb3reg
  557.     rts
  558.  
  559. ; ***************************************************************
  560.  
  561. ;void PSB2_reconstruct(char *dest, char *dest1, char *source, char *source1, int row_incr);
  562.  
  563.     XDEF    _PSB2_reconstruct
  564. _PSB2_reconstruct:
  565.     subq.l    #2,d0            ; (int*)   correct row_size
  566.     lsl.l    #2,d0
  567.     moveq    #7,d1
  568. psb2_all_rows:
  569.     move.l    (a2)+,(a0)+
  570.     move.l    (a2)+,(a0)+
  571.     move.l    (a3)+,(a1)+
  572.     move.l    (a3)+,(a1)+
  573.     add.l    d0,a0
  574.     add.l    d0,a1
  575.     dbra    d1,psb2_all_rows
  576.     rts
  577.  
  578.  
  579. ; ***************************************************************
  580.  
  581. ;void PSB1_reconstruct(char *dest, char *source, int row_incr);
  582.  
  583.     XDEF    _PSB1_reconstruct
  584. _PSB1_reconstruct:
  585.     subq.l    #4,d0            ; (int*) correct row_size
  586.     lsl.l    #2,d0
  587.     moveq    #15,d1
  588. psb1_all_rows:
  589.     move.l    (a1)+,(a0)+
  590.     move.l    (a1)+,(a0)+
  591.     move.l    (a1)+,(a0)+
  592.     move.l    (a1)+,(a0)+
  593.     add.l    d0,a0
  594.     dbra    d1,psb1_all_rows
  595.     rts
  596.  
  597. ; ***************************************************************
  598.  
  599. ; void RSB4_reconstruct(char *dest, char *source1, char *source2, int row_size);
  600. ;
  601.  
  602.     XDEF    _RSB4_reconstruct
  603. _RSB4_reconstruct:
  604. rsb4reg REG    d2-d4
  605.     movem.l    rsb4reg,-(sp)
  606.  
  607.     subq.l    #8,d0            ; correct row_size
  608.  
  609.     move.l    #$fefefefe,d3
  610.  
  611.     moveq    #7,d4
  612. rsb4_all_rows:
  613.  
  614.     REPT    2
  615.     move.l    (a1)+,d1
  616.     move.l    (a2)+,d2
  617.     and.l    d3,d1
  618.     and.l    d3,d2
  619.     add.l    d1,d2
  620.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  621.     move.l    d2,(a0)+        ; this one kicks ass !!!
  622.     ENDR
  623.  
  624.     add.l    d0,a1
  625.     add.l    d0,a2
  626.     dbra    d4,rsb4_all_rows
  627.  
  628.     movem.l    (sp)+,rsb4reg
  629.     rts
  630.  
  631.  
  632. ; ***************************************************************
  633.  
  634. ;void RSB3_reconstruct(char *dest, char *source, int row_size);
  635.  
  636.     XDEF    _RSB3_reconstruct
  637. _RSB3_reconstruct:
  638.     subq.l    #8,d0            ; correct row_size
  639.     moveq    #3,d1
  640. rsb3_all_rows:
  641.     rept    2
  642.     move.l    (a1)+,(a0)+
  643.     move.l    (a1)+,(a0)+
  644.     add.l    d0,a1
  645.     endr
  646.     dbra    d1,rsb3_all_rows
  647.     rts
  648.  
  649. ; ***************************************************************
  650.  
  651. ; void RSB2_reconstruct(char *dest, char *source1, char *source2, int row_size);
  652. ;
  653.  
  654.     XDEF    _RSB2_reconstruct
  655. _RSB2_reconstruct:
  656. rsb2reg REG    d2-d4
  657.     movem.l    rsb2reg,-(sp)
  658.  
  659.     sub.l    #16,d0            ; correct row_size
  660.  
  661.     move.l    #$fefefefe,d3
  662.  
  663.     moveq    #15,d4
  664. rsb2_all_rows:
  665.  
  666.     REPT    4
  667.     move.l    (a1)+,d1
  668.     move.l    (a2)+,d2
  669.     and.l    d3,d1
  670.     and.l    d3,d2
  671.     add.l    d1,d2
  672.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  673.     move.l    d2,(a0)+        ; this one kicks ass !!!
  674.     ENDR
  675.  
  676.     add.l    d0,a1
  677.     add.l    d0,a2
  678.     dbra    d4,rsb2_all_rows
  679.  
  680.     movem.l    (sp)+,rsb2reg
  681.     rts
  682.  
  683.  
  684. ; ***************************************************************
  685.  
  686. ;void RSB1_reconstruct(char *dest, char *source, int row_size);
  687.  
  688.     XDEF    _RSB1_reconstruct
  689. _RSB1_reconstruct:
  690.     sub.l    #16,d0            ; correct row_size
  691.     moveq    #15,d1
  692. rsb1_all_rows:
  693.     move.l    (a1)+,(a0)+
  694.     move.l    (a1)+,(a0)+
  695.     move.l    (a1)+,(a0)+
  696.     move.l    (a1)+,(a0)+
  697.     add.l    d0,a1
  698.     dbra    d1,rsb1_all_rows
  699.     rts
  700.  
  701. ; ***************************************************************
  702.     ifeq    1
  703.  
  704. ;void BM_reconstruct(char *index, char *rindex1, int row_size);
  705.  
  706.     XDEF    _BM_reconstruct
  707. _BM_reconstruct:
  708.     subq.l    #8,d0            ; correct row_size
  709.     moveq    #3,d1
  710. bm_all_rows:
  711.     rept    2
  712.     move.l    (a1)+,(a0)+
  713.     move.l    (a1)+,(a0)+
  714.     add.l    d0,a0
  715.     add.l    d0,a1
  716.     endr
  717.     dbra    d1,bm_all_rows
  718.     rts
  719.  
  720.  
  721. ; ***************************************************************
  722.  
  723. ;void BMcm_reconstruct(char *index, char *rindex1, short *blockvals, int row_size);
  724.  
  725.  
  726.     XDEF    _BMcm_reconstruct
  727. _BMcm_reconstruct:
  728. bmcmreg REG    d2-d5/a4
  729.     movem.l    bmcmreg,-(sp)
  730.  
  731.     lea    _clamp,a4
  732.  
  733.     subq.l    #8,d0            ; correct row_size
  734.  
  735.     moveq    #7,d5
  736. bmcm_all_rows:
  737.  
  738.  
  739.     REPT    2
  740.     move.l    (a1)+,d3
  741.  
  742.     moveq    #0,d1
  743.     move.b    d3,d1
  744.  
  745.     lsr.l    #8,d3
  746.     moveq    #0,d4
  747.     move.b    d3,d4
  748.  
  749.     lsr.w    #8,d3        ; *grin evilly*  eadiz, peecee  *strut*
  750.     add.l    (a2)+,d3
  751.     move.w    d3,d2
  752.     swap    d3
  753.  
  754.     move.w    (a4,d3.w*2),d3
  755.     move.b    (a4,d2.w*2),d3
  756.     swap    d3
  757.  
  758.     add.w    (a2)+,d4
  759.     add.w    (a2)+,d1
  760.     move.w    (a4,d4.w*2),d3
  761.     move.b    (a4,d1.w*2),d3
  762.  
  763.     move.l    d3,(a0)+
  764.     ENDR
  765.  
  766.     add.l    d0,a0
  767.     add.l    d0,a1
  768.     dbra    d5,bmcm_all_rows
  769.  
  770.     movem.l    (sp)+,bmcmreg
  771.     rts
  772.  
  773.  
  774. ; ***************************************************************
  775.  
  776. ;void BIMcm_reconstruct(char *index, char *rindex1, char *bindex1, short *blockvals, int row_size);
  777.  
  778.  
  779.     XDEF    _BIMcm_reconstruct
  780. _BIMcm_reconstruct:
  781. bimcmreg REG    d2-d6/a4
  782.     movem.l    bimcmreg,-(sp)
  783.  
  784.     lea    _clamp,a4
  785.  
  786.     subq.l    #8,d0            ; correct row_size
  787.  
  788.     move.l    #$fefefefe,d4
  789.  
  790.     moveq    #7,d5
  791. bimcm_all_rows:
  792.  
  793.     REPT    2
  794.  
  795.     move.l    (a1)+,d1
  796.     move.l    (a2)+,d3
  797.     and.l    d4,d1
  798.     and.l    d4,d3
  799.     add.l    d1,d3
  800.     roxr.l    #1,d3        ; tricky! get bit #32 from the previous addition
  801.  
  802.     moveq    #0,d1
  803.     move.b    d3,d1
  804.  
  805.     lsr.l    #8,d3
  806.     moveq    #0,d6
  807.     move.b    d3,d6
  808.  
  809.     lsr.w    #8,d3        ; *grin evilly*  eadiz, peecee  *strut*
  810.     add.l    (a3)+,d3
  811.     move.w    d3,d2
  812.     swap    d3
  813.  
  814.     move.w    (a4,d3.w*2),d3
  815.     move.b    (a4,d2.w*2),d3
  816.     swap    d3
  817.  
  818.  
  819.     add.w    (a3)+,d6
  820.     add.w    (a3)+,d1
  821.     move.w    (a4,d6.w*2),d3
  822.     move.b    (a4,d1.w*2),d3
  823.  
  824.     move.l    d3,(a0)+
  825.     ENDR
  826.  
  827.     add.l    d0,a0
  828.     add.l    d0,a1
  829.     add.l    d0,a2
  830.     dbra    d5,bimcm_all_rows
  831.  
  832.     movem.l    (sp)+,bimcmreg
  833.     rts
  834.  
  835.  
  836. ; ***************************************************************
  837.  
  838. ;void BIM_reconstruct(char *index, char *rindex1, char *bindex1, int row_size);
  839. ;
  840.  
  841.     XDEF    _BIM_reconstruct
  842. _BIM_reconstruct:
  843. bimreg REG    d2-d4
  844.     movem.l    bimreg,-(sp)
  845.  
  846.     subq.l    #8,d0            ; correct row_size
  847.  
  848.     move.l    #$fefefefe,d3
  849.  
  850.     moveq    #7,d4
  851. bim_all_rows:
  852.  
  853.     REPT    2
  854.     move.l    (a1)+,d1
  855.     move.l    (a2)+,d2
  856.     and.l    d3,d1
  857.     and.l    d3,d2
  858.     add.l    d1,d2
  859.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  860.     move.l    d2,(a0)+        ; this one kicks ass !!!
  861.     ENDR
  862.  
  863.     add.l    d0,a0
  864.     add.l    d0,a1
  865.     add.l    d0,a2
  866.     dbra    d4,bim_all_rows
  867.  
  868.     movem.l    (sp)+,bimreg
  869.     rts
  870.  
  871.  
  872. ; ***************************************************************
  873.  
  874.     XDEF    _IM_reconstruct
  875. _IM_reconstruct:
  876. cdctreg REG    d2-d3/a2
  877.     movem.l    cdctreg,-(sp)
  878.  
  879.     lea    _clamp,a2
  880.  
  881.     subq.l    #8,d0            ; correct row_size
  882.  
  883.     moveq    #7,d2
  884. cdct_all_rows:
  885.  
  886.     REPT    2
  887.     move.w    (a1)+,d1
  888.     move.w    (a2,d1.w*2),d3
  889.     move.w    (a1)+,d1
  890.     move.b    (a2,d1.w*2),d3
  891.     swap    d3
  892.     move.w    (a1)+,d1
  893.     move.w    (a2,d1.w*2),d3
  894.     move.w    (a1)+,d1
  895.     move.b    (a2,d1.w*2),d3
  896.     move.l    d3,(a0)+
  897.     ENDR
  898.  
  899.     add.l    d0,a0
  900.     dbra    d2,cdct_all_rows
  901.  
  902.     movem.l    (sp)+,cdctreg
  903.     rts
  904.  
  905.     endc
  906. ; ***************************************************************
  907.  
  908.     XDEF    @clear64words
  909. @clear64words:
  910.     moveq    #7,d0
  911. c64i:    clr.l    (a0)+
  912.     clr.l    (a0)+
  913.     clr.l    (a0)+
  914.     clr.l    (a0)+
  915.     dbra    d0,c64i
  916.     rts
  917.  
  918. ; ***************************************************************
  919.  
  920.     SECTION    __MERGED,DATA
  921.  
  922.  
  923. ;
  924. ; Decoding table for coded_block_pattern
  925. ;
  926.  
  927. ;    XDEF    _coded_block_pattern
  928.  
  929. _coded_block_pattern:
  930.     dc.b    ER,0,ER,0,39,9,27,9,59,9,55,9,47,9,31,9
  931.     dc.b    58,8,58,8,54,8,54,8,46,8,46,8,30,8,30,8
  932.     dc.b    57,8,57,8,53,8,53,8,45,8,45,8,29,8,29,8
  933.     dc.b    38,8,38,8,26,8,26,8,37,8,37,8,25,8,25,8
  934.     dc.b    43,8,43,8,23,8,23,8,51,8,51,8,15,8,15,8
  935.     dc.b    42,8,42,8,22,8,22,8,50,8,50,8,14,8,14,8
  936.     dc.b    41,8,41,8,21,8,21,8,49,8,49,8,13,8,13,8
  937.     dc.b    35,8,35,8,19,8,19,8,11,8,11,8,7,8,7,8
  938.     dc.b    34,7,34,7,34,7,34,7,18,7,18,7,18,7,18,7
  939.     dc.b    10,7,10,7,10,7,10,7,6,7,6,7,6,7,6,7
  940.     dc.b    33,7,33,7,33,7,33,7,17,7,17,7,17,7,17,7
  941.     dc.b    9,7,9,7,9,7,9,7,5,7,5,7,5,7,5,7
  942.     dc.b    63,6,63,6,63,6,63,6,63,6,63,6,63,6,63,6
  943.     dc.b    3,6,3,6,3,6,3,6,3,6,3,6,3,6,3,6
  944.     dc.b    36,6,36,6,36,6,36,6,36,6,36,6,36,6,36,6
  945.     dc.b    24,6,24,6,24,6,24,6,24,6,24,6,24,6,24,6
  946.     dc.b    62,5,62,5,62,5,62,5,62,5,62,5,62,5,62,5
  947.     dc.b    62,5,62,5,62,5,62,5,62,5,62,5,62,5,62,5
  948.     dc.b    2,5,2,5,2,5,2,5,2,5,2,5,2,5,2,5
  949.     dc.b    2,5,2,5,2,5,2,5,2,5,2,5,2,5,2,5
  950.     dc.b    61,5,61,5,61,5,61,5,61,5,61,5,61,5,61,5
  951.     dc.b    61,5,61,5,61,5,61,5,61,5,61,5,61,5,61,5
  952.     dc.b    1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5
  953.     dc.b    1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5
  954.     dc.b    56,5,56,5,56,5,56,5,56,5,56,5,56,5,56,5
  955.     dc.b    56,5,56,5,56,5,56,5,56,5,56,5,56,5,56,5
  956.     dc.b    52,5,52,5,52,5,52,5,52,5,52,5,52,5,52,5
  957.     dc.b    52,5,52,5,52,5,52,5,52,5,52,5,52,5,52,5
  958.     dc.b    44,5,44,5,44,5,44,5,44,5,44,5,44,5,44,5
  959.     dc.b    44,5,44,5,44,5,44,5,44,5,44,5,44,5,44,5
  960.     dc.b    28,5,28,5,28,5,28,5,28,5,28,5,28,5,28,5
  961.     dc.b    28,5,28,5,28,5,28,5,28,5,28,5,28,5,28,5
  962.     dc.b    40,5,40,5,40,5,40,5,40,5,40,5,40,5,40,5
  963.     dc.b    40,5,40,5,40,5,40,5,40,5,40,5,40,5,40,5
  964.     dc.b    20,5,20,5,20,5,20,5,20,5,20,5,20,5,20,5
  965.     dc.b    20,5,20,5,20,5,20,5,20,5,20,5,20,5,20,5
  966.     dc.b    48,5,48,5,48,5,48,5,48,5,48,5,48,5,48,5
  967.     dc.b    48,5,48,5,48,5,48,5,48,5,48,5,48,5,48,5
  968.     dc.b    12,5,12,5,12,5,12,5,12,5,12,5,12,5,12,5
  969.     dc.b    12,5,12,5,12,5,12,5,12,5,12,5,12,5,12,5
  970.     dc.b    32,4,32,4,32,4,32,4,32,4,32,4,32,4,32,4
  971.     dc.b    32,4,32,4,32,4,32,4,32,4,32,4,32,4,32,4
  972.     dc.b    32,4,32,4,32,4,32,4,32,4,32,4,32,4,32,4
  973.     dc.b    32,4,32,4,32,4,32,4,32,4,32,4,32,4,32,4
  974.     dc.b    16,4,16,4,16,4,16,4,16,4,16,4,16,4,16,4
  975.     dc.b    16,4,16,4,16,4,16,4,16,4,16,4,16,4,16,4
  976.     dc.b    16,4,16,4,16,4,16,4,16,4,16,4,16,4,16,4
  977.     dc.b    16,4,16,4,16,4,16,4,16,4,16,4,16,4,16,4
  978.     dc.b    8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4
  979.     dc.b    8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4
  980.     dc.b    8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4
  981.     dc.b    8,4,8,4,8,4,8,4,8,4,8,4,8,4,8,4
  982.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  983.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  984.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  985.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  986.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  987.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  988.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  989.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  990.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  991.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  992.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  993.     dc.b    60,3,60,3,60,3,60,3,60,3,60,3,60,3,60,3
  994.  
  995.  
  996. ;    XDEF    _dct_dc_size_luminance
  997. ;    XDEF    _dct_dc_size_chrominance
  998.  
  999. _dct_dc_size_luminance:
  1000.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1001.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1002.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1003.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1004.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1005.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1006.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1007.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1008.     dc.b    0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3
  1009.     dc.b    0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3
  1010.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1011.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1012.     dc.b    4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3
  1013.     dc.b    4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3
  1014.     dc.b    5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4
  1015.     dc.b    6,5,6,5,6,5,6,5,7,6,7,6,8,7,ER,0
  1016.  
  1017.  
  1018. _dct_dc_size_chrominance:
  1019.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1020.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1021.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1022.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1023.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1024.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1025.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1026.     dc.b    0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2
  1027.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1028.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1029.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1030.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1031.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1032.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1033.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1034.     dc.b    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2
  1035.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1036.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1037.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1038.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1039.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1040.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1041.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1042.     dc.b    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
  1043.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1044.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1045.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1046.     dc.b    3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
  1047.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  1048.     dc.b    4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  1049.     dc.b    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
  1050.     dc.b    6,6,6,6,6,6,6,6,7,7,7,7,8,8,ER,0
  1051.  
  1052.  
  1053.     END
  1054.